package com.catmiao.rdd.instance;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

/**
 * @author ChengMiao
 * @title: Spark05_Disk_Partition
 * @projectName spark_study
 * @description: TODO
 * @date 2024/8/9 00:01
 */
public class Spark05_Disk_Partition {

    public static void main(String[] args) {

        SparkConf sparkConf = new SparkConf();
        sparkConf.setMaster("local[4]");
        sparkConf.setAppName("spark");


        JavaSparkContext context = new JavaSparkContext(sparkConf);


        /**
         * Spark 读取文件可以传递路径，这个路径可以是绝对路径，也可以是相对路径
         *
         * 文件数据源分区设定也存在多个位置:
         *          1. textFile可以传递第二个参数，表示分区数【最小分区数】
         *                  默认值： 2 与 defaultParallelism的最小值
         *          2. 使用配置参数：spark.default.parallelism => 4 => math.min(4,2)
         *          3. 采用环境默认总核数 => math.min(总核数,2)
         *
         * Spark框架基于MR开发
         *          1. Spark框架文件操作是没有自己的实现的，采用MR库【Hadoop】实现
         *          2. 当前读取文件的切片数量不是由Spark决定，而是由Hadoop决定
         *
         * hadoop切片规则:
         *          1. totalSize：文件总大小  9byte
         *          2. goalSize：每个分区的字节数 9/2 =4byte
         *          3. part_num：分区数 9/4 = 2...1
         *              - 用当前分区剩余的字节数占每个分区字节数的占比，如果大于10%,则创建新的分区  1/2 = 50% >10%  2+1 = 3个分区
         *
         */
        JavaRDD<String> rdd = context.textFile("datas/1.txt");

        rdd.saveAsTextFile("java_out/01");

        context.close();
    }
}
